﻿using System;
using System.IO;
using System.Data;
using System.Windows;
using System.Collections;
using System.Windows.Input;
using System.ComponentModel;
using System.Windows.Controls;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.Infra.UI.Controls.SmartClient;
using System.Collections.Generic;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;
using Sinacor.UI.Bovespa.Parametro.Presenter;
using Sinacor.UI.Bovespa.Parametro.View.SmartClient;
using PSE.Framework.UI.Resources;


namespace Sinacor.UI.Bovespa.Parametro.View.SmartClient
{
    public partial class CadastroCarteiraMercado : SinacorWindow, ICarteiraMercado
    {
        #region Atributos
        public Presenter.CarteiraMercado presenter { get; set; }
        private string _style = string.Empty;
        #endregion

        #region Construtor
        public CadastroCarteiraMercado()
        {
            InitializeComponent();
                        
            this.dtgCarteiras.NewItemType = typeof(Model.Carteira);
            this.dtgMercados.NewItemType = typeof(Model.Mercado);
            this.presenter = new CarteiraMercado(this);            
            this.DataContext = this.presenter;            
            this.AfterInitialize +=new RoutedEventHandler(CadastroCarteiraMercado_AfterInitialize);
            this.Closing +=new System.ComponentModel.CancelEventHandler(CadastroCarteiraMercado_Closing);            
        }
        #endregion

        #region CadastroCarteiraMercado_AfterInitialize
        void CadastroCarteiraMercado_AfterInitialize(object sender, RoutedEventArgs e)
        {
            this.presenter.Inicializar();
            this.cboBolsas.SelectedIndex = 0;
        }
        #endregion

        #region CadastroCarteiraMercado_Closing
        void CadastroCarteiraMercado_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            this.dtgCarteiras.EndInsert();
            this.dtgCarteiras.EndUpdate();
            this.dtgMercados.EndInsert();
            this.dtgMercados.EndUpdate();
        }
        #endregion

        #region ICarteiraMercado Members

        public void AtualizarComboBolsas()
        {
            this.cboBolsas.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
        }

        public void AtualizarGridCarteiras()
        {            
            this.dtgCarteiras.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void AtualizarGridMercados()
        {
            this.dtgMercados.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public bool ConfirmaExclusaoMercado()
        {
            return (SinacorMessageBox.Show((string)ResourceProviderManager.GetResourceProvider().TryGetResource("FaturamentoBovespa.Cadastros.Message.ConfirmaExclusaoMercado"), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes);
        }

        public bool ConfirmaExclusaoCarteira()
        {
            return (SinacorMessageBox.Show((string)ResourceProviderManager.GetResourceProvider().TryGetResource("FaturamentoBovespa.Cadastros.Message.ConfirmaExclusaoCarteira"), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question) == SinacorMessageBoxResult.Yes);
        }

        public void InformarNenhumRegistroEncontrado()
        {
            SinacorMessageBox.Show(FindResource("FaturamentoBovespa.Cadastros.Message.DadosNaoEncontrados").ToString());
        }

        public void InformarInclusaoSucesso()
        {
            SinacorMessageBox.Show(FindResource("FaturamentoBovespa.Cadastros.Message.SucessoInclusao").ToString());
        }

        public void InformarAlteracaoSucesso()
        {
            SinacorMessageBox.Show(FindResource("FaturamentoBovespa.Movimento.Message.AlteracaoRealizada").ToString());
        }

        public void InformarCancelamentoRelacionamentoSucesso()
        {
            SinacorMessageBox.Show(FindResource("FaturamentoBovespa.Cadastros.Message.SucessoExclusaoRelac").ToString());
        }

        public void InformarExclusaoSucesso()
        {
            SinacorMessageBox.Show(FindResource("FaturamentoBovespa.Cadastros.Message.ExclusaoRealizada").ToString());
        }

        public void InformarRelacionamentoSucesso()
        {
            SinacorMessageBox.Show(FindResource("FaturamentoBovespa.Cadastros.Message.SucessoRelac").ToString());
        }

        public void InformarCarteiraPrioritariaSucesso()
        {
            SinacorMessageBox.Show(FindResource("FaturamentoBovespa.Cadastros.Message.PrioridadeDefinida").ToString());
        }

        public void InformarCarteiraNaoSelecionada()
        {
            SinacorMessageBox.Show(FindResource("FaturamentoBovespa.Cadastros.Message.CarteiraNaoSelecionada").ToString());
        }
        #endregion

        #region Eventos

        private void btnPesquisa_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            if (e.OriginalSource is SinacorButton)
            {
                this.ShowUserWaitingProcess();

                if (rdbCompra.IsChecked.Value)
                {
                    this.presenter.FiltroMercado.NaturezaOperacao = Model.Enum.NaturezaOperacao.Compra;
                }
                else
                {
                    this.presenter.FiltroMercado.NaturezaOperacao = Model.Enum.NaturezaOperacao.Venda;
                }

                this.presenter.ListaCarteiras = new ModelCollection<Model.Carteira>();
                
                this.presenter.ConsultarMercados();

                if (this.presenter.ListaMercados.Count > 0)
                {
                    this.dtgMercados.SelectedIndex = 0;
                }

                this.HideUserWaitingProcess();
            }
        }

        private void btnNovaPesquisa_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {            
            if (e.OriginalSource is SinacorButton)
            {
                Limpar();
            }
        }

        private void Limpar()
        {
            this.ClearServiceErrors();
            this.rdbCompra.IsChecked = true;
            this.rdbVenda.IsChecked = false;
            this.cboBolsas.SelectedIndex = 0;
            this.presenter.ListaMercados = new ModelCollection<Model.Mercado>();
            this.presenter.ListaCarteiras = new ModelCollection<Model.Carteira>();
            this.AtualizarGridMercados();            
            this.AtualizarGridCarteiras();
        }

        private void dtgMercados_EndingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (dtgMercados.GetInsertionRow() != null)
                {
                    this.ClearServiceErrors();

                    this.ShowUserWaitingProcess();

                    this.presenter.Mercado = dtgMercados.EditItem as Model.Mercado;

                    if (!this.presenter.IncluirMercado())
                    {
                        e.Cancel = true;
                        e.Handled = true;                        
                    }

                    this.HideUserWaitingProcess();
                }
            }
        }

        private void dtgMercados_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();

                this.ShowUserWaitingProcess();

                this.presenter.Mercado = dtgMercados.EditItem as Model.Mercado;

                if (!this.presenter.AlterarMercado())
                {
                    e.Cancel = true;
                    e.Handled = true;
                }

                this.HideUserWaitingProcess();
            }
        }

        private void dtgCarteiras_EndingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();

                this.ShowUserWaitingProcess();

                this.presenter.Carteira = dtgCarteiras.EditItem as Model.Carteira;

                if (!this.presenter.IncluirCarteira())
                {
                    e.Cancel = true;
                    e.Handled = true;
                }

                this.HideUserWaitingProcess();
            }
        }

        private void dtgCarteiras_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();

                this.ShowUserWaitingProcess();

                this.presenter.Carteira = dtgCarteiras.EditItem as Model.Carteira;

                if (!this.presenter.AlterarCarteira())
                {
                    e.Cancel = true;
                    e.Handled = true;
                }

                this.HideUserWaitingProcess();
            }
        }

        private void ContextMenu_RelacionarMercadosCarteiras_Click(object sender, RoutedEventArgs e)
        {
            if (this.dtgCarteiras.SelectedItem != null)
            {
                this.ClearServiceErrors();

                this.ShowUserWaitingProcess();

                this.presenter.Carteira = (Model.Carteira)this.dtgCarteiras.SelectedItem;
                
                this.presenter.RelacionarCarteiraMercado();                

                this.HideUserWaitingProcess();
            }
            else
            {
                this.InformarCarteiraNaoSelecionada();
            }
        }

        private void ContextMenu_CancelarRelacionamento_Click(object sender, RoutedEventArgs e)
        {
            if (this.dtgCarteiras.SelectedItem != null)
            {
                this.ClearServiceErrors();

                this.ShowUserWaitingProcess();

                this.presenter.Carteira = (Model.Carteira)this.dtgCarteiras.SelectedItem;

                this.presenter.CancelarRelacionamentoCarteiraMercado();                                                            
                                                                              
                this.HideUserWaitingProcess();
            }
            else
            {
                this.InformarCarteiraNaoSelecionada();
            }
        }

        private void ContextMenu_DefinirCarteiraPrioritaria_Click(object sender, RoutedEventArgs e)
        {
            if (this.dtgCarteiras.SelectedItem != null)
            {
                this.ClearServiceErrors();

                this.ShowUserWaitingProcess();

                this.presenter.Carteira = (Model.Carteira)this.dtgCarteiras.SelectedItem;

                this.presenter.AlterarCarteiraPrioritaria();

                this.HideUserWaitingProcess();
            }
            else
            {
                this.InformarCarteiraNaoSelecionada();
            }
        }

        private void dtgMercados_Deleting(object sender, CancelItemsEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();

                this.ShowUserWaitingProcess();

                this.presenter.Mercado = (Model.Mercado)this.dtgMercados.SelectedItem;

                if (!this.presenter.ExcluirMercado())
                {
                    e.Cancel = true;
                }

                this.HideUserWaitingProcess();
            }
        }

        private void dtgCarteiras_Deleting(object sender, CancelItemsEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                this.ClearServiceErrors();

                this.ShowUserWaitingProcess();

                this.presenter.Carteira = (Model.Carteira)this.dtgCarteiras.SelectedItem;

                if (!this.presenter.ExcluirCarteira())
                {
                    e.Cancel = true;
                }

                this.HideUserWaitingProcess();
            }
        }

        private void dtgMercados_BufferedSelectionChanged(object sender, BufferedEventArgs<SelectionChangedEventArgs> e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (this.dtgMercados.SelectedItem != null)
                {
                    this.ShowUserWaitingProcess();

                    this.presenter.FiltroCarteira.CodigoBolsa = this.presenter.FiltroMercado.CodigoBolsa;
                    
                    if (this.presenter.FiltroMercado.NaturezaOperacao == Model.Enum.NaturezaOperacao.Compra)
                    {
                        this.presenter.FiltroCarteira.NaturezaOperacao = Model.Enum.NaturezaOperacao.Compra;
                    }
                    else
                    {
                        this.presenter.FiltroCarteira.NaturezaOperacao = Model.Enum.NaturezaOperacao.Venda;
                    }

                    this.presenter.FiltroCarteira.Sigla = ((Model.Mercado)this.dtgMercados.SelectedItem).Sigla;
                    
                    this.presenter.ConsultarCarteiras();

                    this.HideUserWaitingProcess();
                }
            }
        }

        private void dtgCarteiras_ApplyingStyle(object sender, ApplyStyleEventArgs e)
        {
            if (e.ItemInfo.Item != null)
            {
                _style = string.Empty;

                // Verifica se quem disparou o evento foi uma linha
                if (e.OriginalSource is BaseRow)
                {
                    Model.Carteira carteira = (e.ItemInfo.Item as Model.Carteira);

                    // Carteira prioritaria
                    if (carteira.CarteiraPrioritaria == true)
                    {
                        _style = BaseRow.GridRowBusiness04;
                    }
                    else
                    {
                        // Carteira relacionada
                        if (carteira.MercadoRelacionado == true)
                        {
                            _style = BaseRow.GridRowBusiness01;
                        }
                        else
                        {
                            // Carteira nao relacionada
                            if (carteira.MercadoRelacionado != true)
                            {
                                _style = BaseRow.GridRowBusiness08;
                            }
                        }
                    }
                }

                e.Style = _style;
            }
        }

        private void dtgMercados_CancelingInsert(object sender, CancelItemEventArgs e)
        {
            this.ClearServiceErrors();
            this.ClearChanges();
        }

        private void dtgMercados_CancelingUpdate(object sender, CancelItemEventArgs e)
        {
            this.ClearServiceErrors();
            this.ClearChanges();
        }

        private void CodigoMercado_LostFocus(object sender, RoutedEventArgs e)
        {
            if (this.dtgMercados.EditItem != null)
            {
                this.ClearServiceErrors();

                this.ShowUserWaitingProcess();

                this.presenter.Mercado = (Model.Mercado)this.dtgMercados.EditItem;
                this.presenter.FiltroCodigoMercado.CodigoMercado = (Int16)this.presenter.Mercado.Codigo;

                this.presenter.ObterMercado();

                SinacorTextBox _txtSigla = (SinacorTextBox)ControlHelper.FindChild(dtgMercados.GetEditRow(), "TxtSigla");
                SinacorTextBox _txtDescricaoMercado = (SinacorTextBox)ControlHelper.FindChild(dtgMercados.GetEditRow(), "TxtDescricaoMercado");
                if (this.presenter.dadosMercado != null)
                {
                    _txtSigla.IsReadOnly = true;
                    _txtDescricaoMercado.IsReadOnly = true;
                    this.presenter.Mercado.Descricao = this.presenter.dadosMercado.Descricao;
                    this.presenter.Mercado.Sigla = this.presenter.dadosMercado.Sigla;
                }
                else
                {
                    _txtSigla.IsReadOnly = false;
                    _txtDescricaoMercado.IsReadOnly = false;
                }

                this.HideUserWaitingProcess();
            }
        }

        #endregion

    }
}
